﻿/// <summary>
/// 提供快捷的方法执行setTimeout，新的超时时限会取消旧的超时时限
/// </summary>
/// <param name="fn">（可选的） 默认超时的函数</param>
/// <param name="scope">（可选的） 默认超时的作用域</param>
/// <param name="args">（可选的） 默认参数数组</param>
/// <return></return>
Ext.util.DelayedTask = function (fn, scope, args) {
    var me = this,
        id,
        call = function () {
            //取消指定的setInterval函数将要执行的代码 
            clearInterval(id); //id是setInterval函数返回的ID
            id = null;
            fn.apply(scope, args || []);
        };

        //取消所有待定的超时，并重新排列。（执行一个新的延迟任务）
        //delay：延迟毫秒数；
        //newFn：（可选的） 重写传入到构建器的函数
        //newScope：重写传入到构建器的作用域
        //newArgs：（可选的） 重写传入到构建器的参数
        this.delay = function (delay, newFn, newScope, newArgs) {
        //判断实例是否已经有任务正在执行，如果正在执行的任务的时间间隔和当前参数中指定的时间间隔
        //不一样，就通过cancel取消正在执行的任务
        me.cancel();

        fn = newFn || fn;
        scope = newScope || scope;
        args = newArgs || args;
        //每隔delay毫秒调用一次call，直到使用clearInterval清除
        id = setInterval(call, delay); 
    };

    //取消最后的排列超时
    this.cancel = function () {
        if (id) {
            clearInterval(id);
            id = null;
        }
    };
};